//========================================================================
//  SE5 External Events
//========================================================================

#include Script_Main_ExternalEvents_Const.txt

//------------------------------------------------------------------------
// Global Constants
//------------------------------------------------------------------------
globalconst

  BASE_EVENT_RECORD_LENGTH:                        long      := 2
  TIMED_EVENT_RECORD_LENGTH:                       long      := 5  

  PARAM_TYPE_SHIP:                                 long      := 1
  PARAM_TYPE_PLANET:                               long      := 2
  PARAM_TYPE_WARP_POINT:                           long      := 3
  PARAM_TYPE_STAR:                                 long      := 4
  PARAM_TYPE_STORM:                                long      := 5
  PARAM_TYPE_SYSTEM:                               long      := 6
  PARAM_TYPE_PLAYER:                               long      := 7
  PARAM_TYPE_BLACK_HOLE:                           long      := 8
  PARAM_TYPE_NEBULAE:                              long      := 9

  EVENT_ID_SHIP_DAMAGE:                            long      := 1
  EVENT_ID_SHIP_LOSE_MOVEMENT:                     long      := 2
  EVENT_ID_SHIP_LOSE_SUPPLIES:                     long      := 3
  EVENT_ID_SHIP_CARGO_DAMAGE:                      long      := 4
  EVENT_ID_SHIP_REBELS:                            long      := 5
  EVENT_ID_SHIP_EXPERIENCE_CHANGE:                 long      := 6
  EVENT_ID_SHIP_ORDERS_CHANGE:                     long      := 7
  EVENT_ID_SHIP_MOVED:                             long      := 8
  EVENT_ID_PLANET_CONDITIONS_CHANGE:               long      := 9
  EVENT_ID_PLANET_VALUE_CHANGE:                    long      := 10
  EVENT_ID_PLANET_POPULATION_CHANGE:               long      := 11
  EVENT_ID_PLANET_POPULATION_HAPPINESS_CHANGE:     long      := 12
  EVENT_ID_PLANET_POPULATION_RIOT:                 long      := 13
  EVENT_ID_PLANET_POPULATION_REBEL:                long      := 14
  EVENT_ID_PLANET_CARGO_DAMAGE:                    long      := 15
  EVENT_ID_PLANET_PLAGUE_CREATED:                  long      := 16
  EVENT_ID_PLANET_PLAGUE_CURED:                    long      := 17
  EVENT_ID_PLANET_CREATED:                         long      := 18
  EVENT_ID_PLANET_DESTROYED:                       long      := 19
  EVENT_ID_STAR_CREATED:                           long      := 20
  EVENT_ID_STAR_DESTROYED:                         long      := 21
  EVENT_ID_WARP_POINT_CLOSED:                      long      := 22
  EVENT_ID_WARP_POINT_OPENED:                      long      := 23
  EVENT_ID_STORM_CREATED:                          long      := 24
  EVENT_ID_STORM_DESTROYED:                        long      := 25
  EVENT_ID_NEBULAE_CREATED:                        long      := 26
  EVENT_ID_NEBULAE_DESTROYED:                      long      := 27
  EVENT_ID_BLACK_HOLE_CREATED:                     long      := 28
  EVENT_ID_BLACK_HOLE_DESTROYED:                   long      := 29
  EVENT_ID_EMPIRE_POINTS_CHANGE:                   long      := 30
  EVENT_ID_PLANET_FAILED_COUP:                     long      := 31

  EVENT_SEVERITY_LOW:                              long      := 0
  EVENT_SEVERITY_MEDIUM:                           long      := 1
  EVENT_SEVERITY_HIGH:                             long      := 2
  EVENT_SEVERITY_CATASTROPHIC:                     long      := 3

  EVENT_FREQUENCY_NONE:                            long      := 0
  EVENT_FREQUENCY_LOW:                             long      := 1
  EVENT_FREQUENCY_MEDIUM:                          long      := 2
  EVENT_FREQUENCY_HIGH:                            long      := 3

  MESSAGE_TO_NONE:                                 long      := 0
  MESSAGE_TO_OWNER:                                long      := 1
  MESSAGE_TO_SECTOR:                               long      := 2
  MESSAGE_TO_SYSTEM:                               long      := 3
  MESSAGE_TO_ALL:                                  long      := 4
  
  EMPIRE_LARGE:                                    long      := 100
  EMPIRE_MEDIUM:                                   long      := 50

  PLANET_RIOTING:                                  long      := 90
  PLANET_ANGRY:                                    long      := 70
  PLANET_UNHAPPY:                                  long      := 50
  PLANET_JUBILANT:                                 long      := 0

  ONE:                                              long      := 1
  TWO:                                              long      := 2
  THREE:                                            long      := 3
  FOUR:                                             long      := 4
  FIVE:                                             long      := 5
endglobalconst

//------------------------------------------------------------------------
// Global Variables
//------------------------------------------------------------------------
globalvars

  lng_Datafile_Event_Text_ID:                  long      := 0
  lng_Event_Severity:                          long      := 0
  players_colonies:                            long      := 0
  event_counter:                               long      := 0

endglobalvars

//------------------------------------------------------------------------
// Includes
//------------------------------------------------------------------------

//------------------------------------------------------------------------
// Forward Declarations
//------------------------------------------------------------------------
deffunc

function External_Events returns boolean
params
end

function Select_Event returns long
params
  event_severity:      long
end

function Execute_Event returns boolean
params
  event_id:            long
end

function Select_Event_Parameter returns long
params
  param_type:          long
end

function Is_Target_Param_Acceptable returns boolean
params
  param_type:          long
  param_id:            long
end

function Give_Message_To_Players returns boolean
params
  msg_to_type:              long
  to_plr:                   long
  sys_loc:                  long
  sect_loc:                 long
  msg_title:                string
  msg_text:                 string
  small_portrait_pic:       string
  large_portrait_pic:       string
  log_type:                 long
end

function Execute_Event_Ship_Damage returns boolean
params
  ship_id:             long
end

function Execute_Event_Ship_Lose_Movement returns boolean
params
  ship_id:          long
end

function Execute_Event_Ship_Lose_Supplies returns boolean
params
  ship_id:             long
end

function Execute_Event_Ship_Cargo_Damage returns boolean
params
  ship_id:             long
end

function Execute_Event_Ship_Rebels returns boolean
params
  ship_id:             long
end

function Execute_Event_Ship_Experience_Change returns boolean
params
  ship_id:             long
end

function Execute_Event_Ship_Orders_Change returns boolean
params
  ship_id:          long
end

function Execute_Event_Ship_Moved returns boolean
params
  ship_id:             long
end

function Execute_Event_Planet_Conditions_Change returns boolean
params
  planet_id:           long
end

function Execute_Event_Planet_Value_Change returns boolean
params
  planet_id:           long
end

function Execute_Event_Planet_Population_Change returns boolean
params
  planet_id:           long
end

function Execute_Event_Planet_Population_Happiness_Change returns boolean
params
  planet_id:        long
end

function Execute_Event_Planet_Population_Riot returns boolean
params
  planet_id:        long
end

function Execute_Event_Planet_Population_Rebel returns boolean
params
  planet_id:           long
end

function Execute_Event_Planet_Cargo_Damage returns boolean
params
  planet_id:           long
end

function Execute_Event_Planet_Plague_Created returns boolean
params
  planet_id:           long
end

function Execute_Event_Planet_Plague_Cured returns boolean
params
  planet_id:           long
end

function Execute_Event_Planet_Created returns boolean
params
  sys_id:              long
end

function Execute_Event_Planet_Destroyed returns boolean
params
  planet_id:           long
end

function Execute_Event_Star_Created returns boolean
params
  sys_id:              long
end

function Execute_Event_Warp_Point_Closed returns boolean
params
  wp_id:               long
end

function Execute_Event_Warp_Point_Opened returns boolean
params
  sys_id:              long
end

function Execute_Event_Storm_Created returns boolean
params
  sys_id:              long
end

function Execute_Event_Storm_Destroyed returns boolean
params
  storm_id:            long
end

function Execute_Event_Nebulae_Destroyed returns boolean
params
  sys_id:           long
end

function Execute_Event_Black_Hole_Destroyed returns boolean
params
  sys_id:           long
end

function Execute_Event_Empire_Points_Change returns boolean
params
  plr_id:           long
end

function Timed_Events returns boolean
params
end

function Execute_Event_Star_Destroyed_Begin returns boolean
params
  star_id:          long
end

function Execute_Event_Star_Destroyed_In_Progress returns boolean
params
  star_id:          long
  time_remaining:   long
end

function Execute_Event_Star_Destroyed_End returns boolean
params
  star_id:          long
end

function Execute_Event_Nebulae_Created_Begin returns boolean
params
  star_id:          long
end

function Execute_Event_Nebulae_Created_In_Progress returns boolean
params
  star_id:          long
  time_remaining:   long
end

function Execute_Event_Nebulae_Created_End returns boolean
params
  star_id:          long
end

function Execute_Event_Black_Hole_Created_Begin returns boolean
params
  star_id:          long
end

function Execute_Event_Black_Hole_Created_In_Progress returns boolean
params
  star_id:          long
  time_remaining:   long
end

function Execute_Event_Black_Hole_Created_End returns boolean
params
  star_id:          long
end

function Anger_Events returns boolean
params
end

function Execute_Event_Failed_Coup returns boolean
params
  planet_id:   long
end

enddeffunc


//------------------------------------------------------------------------
// Main
//------------------------------------------------------------------------
function Main returns boolean
begin
  set lng_Datafile_Event_Text_ID := Sys_Load_Datafile(0, AI_MAIN_EVENT_EVENTTEXT_TXT)

  if (lng_Datafile_Event_Text_ID > 0) then
    call External_Events()
    call Timed_Events()
  endif

  if (players_colonies >= EMPIRE_MEDIUM) then
     loop
     call External_Events()
     call Timed_Events()
     exitwhen (event_counter > 2)
     endloop
  else
     if (players_colonies >= EMPIRE_LARGE) then
     loop
     call External_Events()
     call Timed_Events()
     exitwhen (event_counter > 4)  
     endloop
     endif
  endif
  
  call Anger_Events() 
    
  call Sys_Unload_Datafile(lng_Datafile_Event_Text_ID)
end

//------------------------------------------------------------------------
function External_Events returns boolean
vars
  event_happened:      boolean
  event_freq:          long
  chance:              long
  event_id:            long
 
begin
  set event_happened := FALSE
  set event_counter := event_counter + 1
  
  set event_freq := Sys_Game_Settings_Get_External_Events_Frequency()
  set lng_Event_Severity := Sys_Game_Settings_Get_External_Events_Severity()
  set players_colonies := Sys_Get_Player_Colonies_Count(sys_long_Player_ID)
  set chance := Sys_Get_Random_Long(1, 100)

  if (players_colonies >= EMPIRE_LARGE) then
   case event_freq
    EVENT_FREQUENCY_NONE:  
      set event_happened := FALSE
    EVENT_FREQUENCY_LOW:   
        if (chance <= 40) then
        set event_happened := TRUE
       endif
    EVENT_FREQUENCY_MEDIUM:
      if (chance <= 55) then
        set event_happened := TRUE
      endif
    EVENT_FREQUENCY_HIGH:  
      if (chance <= 70) then
        set event_happened := TRUE
      endif
    endcase

   else
  
   if (players_colonies >= EMPIRE_MEDIUM) then
   case event_freq
    EVENT_FREQUENCY_NONE:  
      set event_happened := FALSE
    EVENT_FREQUENCY_LOW:   
      if (chance <= 25) then
        set event_happened := TRUE
     endif
    EVENT_FREQUENCY_MEDIUM:
      if (chance <= 40) then
        set event_happened := TRUE
      endif
    EVENT_FREQUENCY_HIGH:  
      if (chance <= 55) then
        set event_happened := TRUE
      endif
   endcase

  else
  
  case event_freq
    EVENT_FREQUENCY_NONE:  
      set event_happened := FALSE
    EVENT_FREQUENCY_LOW:   
      if (chance <= 10) then
        set event_happened := TRUE
      endif
    EVENT_FREQUENCY_MEDIUM:
      if (chance <= 20) then
        set event_happened := TRUE
      endif
    EVENT_FREQUENCY_HIGH:  
      if (chance <= 30) then
        set event_happened := TRUE
      endif
  endcase

  endif 
  endif
   
  
   if (sys_long_game_date <= (Sys_Get_Game_Start_Date() + 20)) then
     set event_happened := FALSE
   endif

  if (lng_Event_Severity > 0) then
    set lng_Event_Severity := Sys_Get_Random_Long(0, lng_Event_Severity)
  endif

  if (event_happened) then
    // Pick a specific event to execute.
    set event_id := Select_Event(lng_Event_Severity)
    if (event_id > 0) then
      call Execute_Event(event_id)
    endif
  endif
end

//------------------------------------------------------------------------
function Select_Event returns long
params
  event_severity:      long
vars
  event_id:            long
  index:               long
  pick_list:           longlist
  weight_list:         longlist
  total_weight:        long
  this_weight:         long
  pick_amount:         long
  list_count:          long
begin
  set event_id := 0

  if (event_severity >= EVENT_SEVERITY_LOW) then
    call pick_list.add(EVENT_ID_SHIP_DAMAGE)
    call weight_list.add(50)
    call pick_list.add(EVENT_ID_SHIP_LOSE_MOVEMENT)
    call weight_list.add(50)
    call pick_list.add(EVENT_ID_SHIP_LOSE_SUPPLIES)
    call weight_list.add(50)
    call pick_list.add(EVENT_ID_SHIP_CARGO_DAMAGE)
    call weight_list.add(50)
    call pick_list.add(EVENT_ID_SHIP_EXPERIENCE_CHANGE)
    call weight_list.add(50)
    call pick_list.add(EVENT_ID_SHIP_ORDERS_CHANGE)
    call weight_list.add(50)
    call pick_list.add(EVENT_ID_SHIP_MOVED)
    call weight_list.add(50)
    call pick_list.add(EVENT_ID_PLANET_CONDITIONS_CHANGE)
    call weight_list.add(50)
    call pick_list.add(EVENT_ID_PLANET_VALUE_CHANGE)
    call weight_list.add(50)
    call pick_list.add(EVENT_ID_PLANET_POPULATION_CHANGE)
    call weight_list.add(50)
    call pick_list.add(EVENT_ID_PLANET_POPULATION_HAPPINESS_CHANGE)
    call weight_list.add(50)
  endif   

  if (event_severity >= EVENT_SEVERITY_MEDIUM) then
    call pick_list.add(EVENT_ID_SHIP_REBELS)
    call weight_list.add(45)
    call pick_list.add(EVENT_ID_PLANET_POPULATION_RIOT)
    call weight_list.add(35)
    call pick_list.add(EVENT_ID_PLANET_CARGO_DAMAGE)
    call weight_list.add(35)
    call pick_list.add(EVENT_ID_PLANET_PLAGUE_CREATED)
    call weight_list.add(35)
    call pick_list.add(EVENT_ID_PLANET_PLAGUE_CURED)
    call weight_list.add(35)
    call pick_list.add(EVENT_ID_EMPIRE_POINTS_CHANGE)
    call weight_list.add(35)
    call pick_list.add(EVENT_ID_PLANET_FAILED_COUP)
    call weight_list.add(20)               
  endif

  if (event_severity >= EVENT_SEVERITY_HIGH) then
    call pick_list.add(EVENT_ID_PLANET_POPULATION_REBEL)
    call weight_list.add(20)
    call pick_list.add(EVENT_ID_PLANET_CREATED)
    call weight_list.add(15)
    call pick_list.add(EVENT_ID_PLANET_DESTROYED)
    call weight_list.add(15)
    call pick_list.add(EVENT_ID_WARP_POINT_CLOSED)
    call weight_list.add(15)
    call pick_list.add(EVENT_ID_WARP_POINT_OPENED)
    call weight_list.add(15)
    call pick_list.add(EVENT_ID_STAR_CREATED)
    call weight_list.add(15)
    call pick_list.add(EVENT_ID_STORM_CREATED)
    call weight_list.add(15)
    call pick_list.add(EVENT_ID_STORM_DESTROYED)
    call weight_list.add(15)
    call pick_list.add(EVENT_ID_NEBULAE_DESTROYED)
    call weight_list.add(15)
    call pick_list.add(EVENT_ID_BLACK_HOLE_DESTROYED)
    call weight_list.add(15)
  endif

  if (event_severity >= EVENT_SEVERITY_CATASTROPHIC) then
    call pick_list.add(EVENT_ID_STAR_DESTROYED)
    call weight_list.add(8)
    call pick_list.add(EVENT_ID_NEBULAE_CREATED)
    call weight_list.add(8)
    call pick_list.add(EVENT_ID_BLACK_HOLE_CREATED)
    call weight_list.add(8)
  endif

  set list_count := pick_list.count()
  if (list_count > 0) then
    set total_weight := 0
    for index := 1 to list_count do
      set total_weight := total_weight + weight_list.Get(index)
    endfor 
    set pick_amount := Sys_Get_Random_Long(1, total_weight)

    set total_weight := 0
    for index := 1 to list_count do
      set this_weight := weight_list.Get(index) 
      if ((pick_amount >= total_weight) and (pick_amount <= (total_weight + this_weight))) then
        set event_id := pick_list.get(index)
      endif
      set total_weight := total_weight + this_weight
    endfor 
  endif

  return event_id
end

//------------------------------------------------------------------------
function Execute_Event returns boolean
params
  event_id:            long
vars
  retval:              boolean
  obj_id:              long
begin
  set retval := FALSE
  set obj_id := 0

  case event_id
    EVENT_ID_SHIP_DAMAGE:    
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP)
      if (obj_id > 0) then
        set retval := Execute_Event_Ship_Damage(obj_id)
      endif
    EVENT_ID_SHIP_LOSE_MOVEMENT:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP)
      if (obj_id > 0) then
        set retval := Execute_Event_Ship_Lose_Movement(obj_id)
      endif
    EVENT_ID_SHIP_LOSE_SUPPLIES:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP)
      if (obj_id > 0) then
        set retval := Execute_Event_Ship_Lose_Supplies(obj_id)
      endif
    EVENT_ID_SHIP_CARGO_DAMAGE: 
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP)
      if (obj_id > 0) then
        set retval := Execute_Event_Ship_Cargo_Damage(obj_id)
      endif
    EVENT_ID_SHIP_REBELS:  
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP)
      if (obj_id > 0) then
        set retval := Execute_Event_Ship_Rebels(obj_id)
      endif
    EVENT_ID_SHIP_EXPERIENCE_CHANGE:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP)
      if (obj_id > 0) then
        set retval := Execute_Event_Ship_Experience_Change(obj_id)
      endif
    EVENT_ID_SHIP_ORDERS_CHANGE:  
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP)
      if (obj_id > 0) then
        set retval := Execute_Event_Ship_Orders_Change(obj_id)
      endif
    EVENT_ID_SHIP_MOVED:        
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SHIP)
      if (obj_id > 0) then
        set retval := Execute_Event_Ship_Moved(obj_id)
      endif
    EVENT_ID_PLANET_CONDITIONS_CHANGE:  
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET)
      if (obj_id > 0) then
        set retval := Execute_Event_Planet_Conditions_Change(obj_id)
      endif
    EVENT_ID_PLANET_VALUE_CHANGE:       
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET)
      if (obj_id > 0) then
        set retval := Execute_Event_Planet_Value_Change(obj_id)
      endif
    EVENT_ID_PLANET_POPULATION_CHANGE:  
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET)
      if (obj_id > 0) then
        set retval := Execute_Event_Planet_Population_Change(obj_id)
      endif
    EVENT_ID_PLANET_POPULATION_HAPPINESS_CHANGE:    
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET)
      if (obj_id > 0) then
        set retval := Execute_Event_Planet_Population_Happiness_Change(obj_id)
      endif
    EVENT_ID_PLANET_POPULATION_RIOT:                
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET)
      if (obj_id > 0) then
        set retval := Execute_Event_Planet_Population_Riot(obj_id)
      endif
    EVENT_ID_PLANET_POPULATION_REBEL:   
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET)
      if (obj_id > 0) then
        set retval := Execute_Event_Planet_Population_Rebel(obj_id)
      endif
    EVENT_ID_PLANET_CARGO_DAMAGE:       
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET)
      if (obj_id > 0) then
        set retval := Execute_Event_Planet_Cargo_Damage(obj_id)
      endif
    EVENT_ID_PLANET_PLAGUE_CREATED:             
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET)
      if (obj_id > 0) then
        set retval := Execute_Event_Planet_Plague_Created(obj_id)
      endif
    EVENT_ID_PLANET_PLAGUE_CURED:                    
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET)
      if (obj_id > 0) then
        set retval := Execute_Event_Planet_Plague_Cured(obj_id)
      endif
    EVENT_ID_PLANET_CREATED:                         
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SYSTEM)
      if (obj_id > 0) then
        set retval := Execute_Event_Planet_Created(obj_id)
      endif
    EVENT_ID_PLANET_DESTROYED:          
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLANET)
      if (obj_id > 0) then
        set retval := Execute_Event_Planet_Destroyed(obj_id)
      endif
    EVENT_ID_STAR_CREATED: 
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SYSTEM)
      if (obj_id > 0) then
        set retval := Execute_Event_Star_Created(obj_id)
      endif
    EVENT_ID_STAR_DESTROYED:            
      set obj_id := Select_Event_Parameter(PARAM_TYPE_STAR)
      if (obj_id > 0) then
        set retval := Execute_Event_Star_Destroyed_Begin(obj_id)
      endif
    EVENT_ID_WARP_POINT_CLOSED:         
      set obj_id := Select_Event_Parameter(PARAM_TYPE_WARP_POINT)
      if (obj_id > 0) then
        set retval := Execute_Event_Warp_Point_Closed(obj_id)
      endif
    EVENT_ID_WARP_POINT_OPENED:         
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SYSTEM)
      if (obj_id > 0) then
        set retval := Execute_Event_Warp_Point_Opened(obj_id)
      endif
    EVENT_ID_STORM_CREATED:
      set obj_id := Select_Event_Parameter(PARAM_TYPE_SYSTEM)
      if (obj_id > 0) then
        set retval := Execute_Event_Storm_Created(obj_id)
      endif
    EVENT_ID_STORM_DESTROYED: 
      set obj_id := Select_Event_Parameter(PARAM_TYPE_STORM)
      if (obj_id > 0) then
        set retval := Execute_Event_Storm_Destroyed(obj_id)
      endif
    EVENT_ID_NEBULAE_CREATED: 
      set obj_id := Select_Event_Parameter(PARAM_TYPE_STAR)
      if (obj_id > 0) then
        set retval := Execute_Event_Nebulae_Created_Begin(obj_id)
      endif
    EVENT_ID_NEBULAE_DESTROYED:  
      set obj_id := Select_Event_Parameter(PARAM_TYPE_NEBULAE)
      if (obj_id > 0) then
        set retval := Execute_Event_Nebulae_Destroyed(obj_id)
      endif
    EVENT_ID_BLACK_HOLE_CREATED: 
      set obj_id := Select_Event_Parameter(PARAM_TYPE_STAR)
      if (obj_id > 0) then
        set retval := Execute_Event_Black_Hole_Created_Begin(obj_id)
      endif
    EVENT_ID_BLACK_HOLE_DESTROYED: 
      set obj_id := Select_Event_Parameter(PARAM_TYPE_BLACK_HOLE)
      if (obj_id > 0) then
        set retval := Execute_Event_Black_Hole_Destroyed(obj_id)
      endif
    EVENT_ID_EMPIRE_POINTS_CHANGE:      
      set obj_id := Select_Event_Parameter(PARAM_TYPE_PLAYER)
      if (obj_id > 0) then
        set retval := Execute_Event_Empire_Points_Change(obj_id)
      endif
  endcase

  return retval
end

//------------------------------------------------------------------------
function Select_Event_Parameter returns long
params
  param_type:       long
vars
  obj_id:           long
  sobj_list:        longlist
  loop_count:       long
  list_count:       long
  pick:             long
begin
  set obj_id := 0

  case param_type
    PARAM_TYPE_SHIP:    
      // Pick a random ship
      call Sys_Get_List_Of_Space_Objects_Of_Type(SPACE_OBJECT_TYPE_SHIP, sobj_list, TRUE, FALSE, 0)
    PARAM_TYPE_PLANET:  
      call Sys_Get_List_Of_Space_Objects_Of_Type(SPACE_OBJECT_TYPE_PLANET, sobj_list, TRUE, FALSE, 0)
    PARAM_TYPE_WARP_POINT:
      call Sys_Get_List_Of_Space_Objects_Of_Type(SPACE_OBJECT_TYPE_WARP_POINT, sobj_list, FALSE, FALSE, 0)
    PARAM_TYPE_STAR:      
      call Sys_Get_List_Of_Space_Objects_Of_Type(SPACE_OBJECT_TYPE_STAR, sobj_list, FALSE, FALSE, 0)
    PARAM_TYPE_STORM:     
      call Sys_Get_List_Of_Space_Objects_Of_Type(SPACE_OBJECT_TYPE_STORM, sobj_list, FALSE, FALSE, 0)
    PARAM_TYPE_SYSTEM:
      call Sys_Get_List_Of_Solar_Systems(sobj_list)
    PARAM_TYPE_PLAYER:    
      call Sys_Get_List_Of_All_Players(sobj_list)
    PARAM_TYPE_BLACK_HOLE:
      call Sys_Get_List_Of_Black_Holes(sobj_list)
    PARAM_TYPE_NEBULAE:
      call Sys_Get_List_Of_Nebulae(sobj_list)
  endcase

  set list_count := sobj_list.count()
  if (list_count > 0) then
    set loop_count := 0
    loop
      set loop_count := loop_count + 1
      set pick := Sys_Get_Random_Long(1, list_count) 
      set obj_id := sobj_list.Get(pick)
      if (not Is_Target_Param_Acceptable(param_type, obj_id)) then 
        set obj_id := 0
        call sobj_list.delete(pick)
        set list_count := sobj_list.count()
      endif
      exitwhen (obj_id > 0) or (loop_count > 1000) or (list_count <= 0)
    endloop
  endif  

  return obj_id
end

//------------------------------------------------------------------------
function Is_Target_Param_Acceptable returns boolean
params
  param_type:          long
  param_id:            long
vars
  retval:              boolean
  sys_loc:             long
  sect_loc:            long
  plr_owner:           long
  plr:                 long
  event_mod:           long
  num_players:         long
begin
  set retval := TRUE
  set num_players := Sys_Get_Number_Of_Players()

  if ((param_type <> PARAM_TYPE_PLAYER) and (param_type <> PARAM_TYPE_SYSTEM)) then
    set sys_loc := Sys_Get_Space_Object_System_Location(param_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(param_id)
    set plr_owner := Sys_Get_Space_Object_Owner(param_id) 
  endif

  // No horrendous events in home systems
  if ((param_type = PARAM_TYPE_PLANET) or (param_type = PARAM_TYPE_STAR)) then
    if (lng_Event_Severity >= EVENT_SEVERITY_HIGH) then
      for plr := 1 to num_players do
        if (sys_loc = Sys_Get_Empire_Home_System(plr)) and (sect_loc = Sys_Get_Empire_Home_Sector(plr)) then
          set retval := FALSE
        endif
      endfor
    endif
  endif

  // No mothballed ships
  if (param_type = PARAM_TYPE_SHIP) then
    if (Sys_Is_Space_Object_Mothballed(param_id)) then
      set retval := FALSE
    endif
  endif

  // Fate Shrines & Luck
  if (sys_loc > 0) and (retval) then
    set event_mod := Sys_Get_Solar_System_Bad_Event_Avoidance_Percent(sys_loc)
    if (Sys_Get_Random_Long(1, 100) <= event_mod) then
      set retval := FALSE
    endif
  endif

  return retval
end

//------------------------------------------------------------------------
function Give_Message_To_Players returns boolean
params
  msg_to_type:              long
  to_plr:                   long
  sys_loc:                  long
  sect_loc:                 long
  msg_title:                string
  msg_text:                 string
  small_portrait_pic:       string
  large_portrait_pic:       string
  log_type:                 long
vars
  plr_list:                 longlist
  index:                    long
  this_plr:                 long
  plr_count:                long
  log_cat:                  long
  log_sub_cat:              long 
  plr_caused:               long
begin
  set log_cat := LOG_CATEGORY_TYPE_EMPIRE_NEWS
  set log_sub_cat := LOG_SUB_CATEGORY_TYPE_EMPIRE_MISC
  set plr_caused := 0

  case msg_to_type
    MESSAGE_TO_OWNER: 
      call plr_list.add(to_plr) 
    MESSAGE_TO_SECTOR: 
      call Sys_Get_Players_In_Sector_List(plr_list, sys_loc, sect_loc)
    MESSAGE_TO_SYSTEM: 
      call Sys_Get_Players_In_System_List(plr_list, sys_loc)
    MESSAGE_TO_ALL:    
      call Sys_Get_All_Players_List(plr_list)
  endcase

  set plr_count := plr_list.count()
  if (plr_count > 0) then
    for index := 1 to plr_count do
      set this_plr := plr_list.get(index)
      call Sys_Add_Empire_Log_Entry(this_plr, sys_loc, sect_loc, msg_title, msg_text, small_portrait_pic, large_portrait_pic, log_type, log_cat, log_sub_cat, plr_caused)
    endfor 
  endif

  return TRUE
end


//------------------------------------------------------------------------
function Execute_Event_Ship_Damage returns boolean
params
  ship_id:          long
vars
  dmg_amount:       long
  ship_destroyed:   boolean
  sys_loc:          long
  sect_loc:         long
  ship_owner:       long
  ship_name:        string
  message_title:    string
  message_text:     string
  msg_small_pic:    string
  msg_large_pic:    string
  log_type:         long
begin
  
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_owner := Sys_Get_Space_Object_Owner(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)

    // How much damage?
    set dmg_amount := Sys_Get_Random_Long(10, 50)

    // Damage the ship
    if (dmg_amount > 0) then
      set ship_destroyed := Sys_Space_Object_Take_Damage(ship_id, AI_MAIN_EVENT_NORMAL, dmg_amount)

      // Log Message to owner
      set log_type := LOG_TYPE_SHIP_DAMAGED
      if (ship_destroyed) then
        set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_2_TITLE)
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_2_TEXT)
        set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_2_SMALL_PICTURE_FILENAME)
        set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_2_LARGE_PICTURE_FILENAME)
      else
        set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_1_TITLE)
        set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_1_TEXT)
        set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_1_SMALL_PICTURE_FILENAME)
        set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_1_LARGE_PICTURE_FILENAME)
      endif

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_VEHICLENAME, ship_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_DAMAGEAMOUNT, Sys_Convert_Long_To_String(dmg_amount), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_OWNER, ship_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif
  return TRUE
end

//------------------------------------------------------------------------
function Execute_Event_Ship_Lose_Movement returns boolean
params
  ship_id:          long
vars
  move_amount:      long
  sys_loc:          long
  sect_loc:         long
  ship_owner:       long
  ship_name:        string
  message_title:    string
  message_text:     string
  msg_small_pic:    string
  msg_large_pic:    string
  log_type:         long
begin
  
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_owner := Sys_Get_Space_Object_Owner(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)

    // How much movement?
    set move_amount := Sys_Get_Random_Long(1, 5)

    // Change the movement
    if (move_amount > 0) then
      call Sys_Space_Object_Change_Movement(ship_id, -move_amount)

      // Log Message to owner
      set log_type := LOG_TYPE_SHIP_LOSE_MOVEMENT
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_3_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_3_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_3_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_3_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_VEHICLENAME, ship_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_MOVEAMOUNT, Sys_Convert_Long_To_String(move_amount), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_OWNER, ship_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return TRUE
end

//------------------------------------------------------------------------
function Execute_Event_Ship_Lose_Supplies returns boolean
params
  ship_id:          long
vars
  supply_amount:    long
  ordnance_amount: long
  sys_loc:          long
  sect_loc:         long
  ship_owner:       long
  ship_name:        string
  message_title:    string
  message_text:     string
  msg_small_pic:    string
  msg_large_pic:    string
  log_type:         long
begin
  
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_owner := Sys_Get_Space_Object_Owner(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)

    // How much?
    set supply_amount := Sys_Get_Random_Long(100, 10000)
    set ordnance_amount := Sys_Get_Random_Long(100, 10000)

    // Change the supplies
    if (supply_amount > 0) or (ordnance_amount > 0) then
      call Sys_Space_Object_Change_Supplies(ship_id, -supply_amount)
      call Sys_Space_Object_Change_Ordnance(ship_id, -ordnance_amount)

      // Log Message to owner
      set log_type := LOG_TYPE_SHIP_LOSE_SUPPLY
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_4_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_4_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_4_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_4_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_VEHICLENAME, ship_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SUPPLYAMOUNT, Sys_Convert_Long_To_String(supply_amount), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_ORDNANCEAMOUNT, Sys_Convert_Long_To_String(ordnance_amount), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_OWNER, ship_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return TRUE
end


//------------------------------------------------------------------------
function Execute_Event_Ship_Rebels returns boolean
params
  ship_id:          long
vars
  sys_loc:          long
  sect_loc:         long
  ship_owner:       long
  ship_name:        string
  message_title:    string
  message_text:     string
  msg_small_pic:    string
  msg_large_pic:    string
  log_type:         long
begin
  
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_owner := Sys_Get_Space_Object_Owner(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)

    // Change the ownership
    call Sys_Space_Object_Set_To_New_Owner(ship_id, 0)

    // Log Message to owner
    set log_type := LOG_TYPE_SHIP_REBEL
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_5_TITLE)
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_5_TEXT)
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_5_SMALL_PICTURE_FILENAME)
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_5_LARGE_PICTURE_FILENAME)

    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_VEHICLENAME, ship_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    call Give_Message_To_Players(MESSAGE_TO_OWNER, ship_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
  endif

  return TRUE
end


//------------------------------------------------------------------------
function Execute_Event_Ship_Experience_Change returns boolean
params
  ship_id:          long
vars
  sys_loc:          long
  sect_loc:         long
  ship_owner:       long
  ship_name:        string
  message_title:    string
  message_text:     string
  msg_small_pic:    string
  msg_large_pic:    string
  log_type:         long
begin
  
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_owner := Sys_Get_Space_Object_Owner(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)

    // Change the experience
    call Sys_Space_Object_Change_Experience(ship_id, -10000)

    // Log Message to owner
    set log_type := LOG_TYPE_SHIP_EXPERIENCE_CHANGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_6_TITLE)
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_6_TEXT)
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_6_SMALL_PICTURE_FILENAME)
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_6_LARGE_PICTURE_FILENAME)

    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_VEHICLENAME, ship_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    call Give_Message_To_Players(MESSAGE_TO_OWNER, ship_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
  endif

  return TRUE
end


//------------------------------------------------------------------------
function Execute_Event_Ship_Cargo_Damage returns boolean
params
  ship_id:          long
vars
  sys_loc:          long
  sect_loc:         long
  ship_owner:       long
  ship_name:        string
  message_title:    string
  message_text:     string
  msg_small_pic:    string
  msg_large_pic:    string
  log_type:         long
begin
  
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_owner := Sys_Get_Space_Object_Owner(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)

    // Change the experience
    call Sys_Space_Object_Delete_Cargo(ship_id)

    // Log Message to owner
    set log_type := LOG_TYPE_SHIP_CARGO_DAMAGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_7_TITLE)
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_7_TEXT)
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_7_SMALL_PICTURE_FILENAME)
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_7_LARGE_PICTURE_FILENAME)

    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_VEHICLENAME, ship_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    call Give_Message_To_Players(MESSAGE_TO_OWNER, ship_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
  endif

  return TRUE
end

//------------------------------------------------------------------------
function Execute_Event_Ship_Orders_Change returns boolean
params
  ship_id:          long
vars
  sys_loc:          long
  sect_loc:         long
  target_sys_loc:   long
  target_sect_loc:  long
  ship_owner:       long
  ship_name:        string
  message_title:    string
  message_text:     string
  msg_small_pic:    string
  msg_large_pic:    string
  log_type:         long
begin
  
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_owner := Sys_Get_Space_Object_Owner(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)

    // Change the orders
    call Sys_Space_Object_Clear_Orders(ship_id)
    call Sys_Space_Object_Clear_Fleet(ship_id)

    set target_sys_loc := Sys_Get_Random_Long(1, Sys_Get_Number_Of_Solar_Systems())
    set target_sect_loc := Sys_Get_Random_Sector()
    call Sys_Give_Space_Object_Order_Moveto(ship_id, target_sys_loc, target_sect_loc)

    // Log Message to owner
    set log_type := LOG_TYPE_SHIP_ORDERS_CHANGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_8_TITLE)
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_8_TEXT)
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_8_SMALL_PICTURE_FILENAME)
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_8_LARGE_PICTURE_FILENAME)

    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_VEHICLENAME, ship_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    call Give_Message_To_Players(MESSAGE_TO_OWNER, ship_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
  endif

  return TRUE
end

//------------------------------------------------------------------------
function Execute_Event_Ship_Moved returns boolean
params
  ship_id:          long
vars
  sys_loc:          long
  sect_loc:         long
  target_sys_loc:   long
  target_sect_loc:  long
  ship_owner:       long
  ship_name:        string
  message_title:    string
  message_text:     string
  msg_small_pic:    string
  msg_large_pic:    string
  log_type:         long
begin
  
  if (ship_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(ship_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(ship_id)
    set ship_owner := Sys_Get_Space_Object_Owner(ship_id)
    set ship_name := Sys_Get_Space_Object_Name(ship_id)

    // Change the orders
    call Sys_Space_Object_Clear_Orders(ship_id)
    call Sys_Space_Object_Clear_Fleet(ship_id)

    set target_sys_loc := Sys_Get_Random_Long(1, Sys_Get_Number_Of_Solar_Systems())
    set target_sect_loc := Sys_Get_Random_Empty_Sector(target_sys_loc)
    if (target_sys_loc > 0) and (target_sect_loc > 0) then
      call Sys_Set_Space_Object_Position(ship_id, target_sys_loc, target_sect_loc)

      // Log Message to owner
      set log_type := LOG_TYPE_SHIP_MOVED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_9_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_9_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_9_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_9_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_VEHICLENAME, ship_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_DESTSYSTEMNAME, Sys_Get_Solar_System_Name(target_sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_DESTSECTORLOC, Sys_Get_Sector_Coordinates(target_sect_loc), TRUE, TRUE)
 
      call Give_Message_To_Players(MESSAGE_TO_OWNER, ship_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return TRUE
end


//------------------------------------------------------------------------
function Execute_Event_Planet_Conditions_Change returns boolean
params
  planet_id:          long
vars
  sys_loc:            long
  sect_loc:           long
  conditions_change:  long
  planet_owner:       long
  planet_name:        string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_owner := Sys_Get_Space_Object_Owner(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    // Set New Conditions
    set conditions_change := -Sys_Get_Random_Long(1, 10)
    call Sys_Change_Planet_Conditions(planet_id, conditions_change)

    // Log Message to owner
    set log_type := LOG_TYPE_PLANET_CONDITION_CHANGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_10_TITLE)
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_10_TEXT)
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_10_SMALL_PICTURE_FILENAME)
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_10_LARGE_PICTURE_FILENAME)

    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_PLANETNAME, planet_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    call Give_Message_To_Players(MESSAGE_TO_OWNER, planet_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
  endif

  return TRUE
end


//------------------------------------------------------------------------
function Execute_Event_Planet_Value_Change returns boolean
params
  planet_id:          long
vars
  sys_loc:            long
  sect_loc:           long
  value_change:       long
  planet_owner:       long
  planet_name:        string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_owner := Sys_Get_Space_Object_Owner(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    // Set New Value
    set value_change := -Sys_Get_Random_Long(4, 20)
    if (Sys_Is_Finite_Resource_Game()) then
      set value_change := -Sys_Get_Random_Long(1, 5) * 100000
    endif
    call Sys_Change_Planet_Value(planet_id, value_change)

    // Log Message to owner
    set log_type := LOG_TYPE_PLANET_VALUE_CHANGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_11_TITLE)
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_11_TEXT)
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_11_SMALL_PICTURE_FILENAME)
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_11_LARGE_PICTURE_FILENAME)

    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_PLANETNAME, planet_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    call Give_Message_To_Players(MESSAGE_TO_OWNER, planet_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
  endif

  return TRUE
end


//------------------------------------------------------------------------
function Execute_Event_Planet_Population_Change returns boolean
params
  planet_id:          long
vars
  sys_loc:            long
  sect_loc:           long
  pop_change:         long
  max_pop:            long
  planet_owner:       long
  planet_name:        string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_owner := Sys_Get_Space_Object_Owner(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    // Set Population Change
    set pop_change := Sys_Get_Random_Long(10, 1000)
    set max_pop := Sys_Get_Planet_Population(planet_id)
    if (pop_change > max_pop) then
      set pop_change := max_pop
    endif
    call Sys_Change_Planet_Population(planet_id, -pop_change)

    // Log Message to owner
    set log_type := LOG_TYPE_PLANET_POP_CHANGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_12_TITLE)
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_12_TEXT)
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_12_SMALL_PICTURE_FILENAME)
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_12_LARGE_PICTURE_FILENAME)

    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_PLANETNAME, planet_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_AMOUNT, Sys_Convert_Long_To_String(pop_change), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    call Give_Message_To_Players(MESSAGE_TO_OWNER, planet_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
  endif

  return TRUE
end


//------------------------------------------------------------------------
function Execute_Event_Planet_Population_Happiness_Change returns boolean
params
  planet_id:          long
vars
  sys_loc:            long
  sect_loc:           long
  happiness_change:   long
  planet_owner:       long
  planet_name:        string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_owner := Sys_Get_Space_Object_Owner(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    if (Sys_Is_Planet_Effected_By_Happiness(planet_id)) then
      // Set Population Happiness
      set happiness_change := Sys_Get_Random_Long(10, 40)
      call Sys_Change_Planet_Population_Happiness(planet_id, -happiness_change)

      // Log Message to owner
      set log_type := LOG_TYPE_PLANET_POP_ANGER_CHANGE
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_13_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_13_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_13_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_13_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_PLANETNAME, planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_OWNER, planet_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return TRUE
end

//------------------------------------------------------------------------
function Execute_Event_Planet_Population_Riot returns boolean
params
  planet_id:          long
vars
  sys_loc:            long
  sect_loc:           long
  planet_owner:       long
  planet_name:        string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_owner := Sys_Get_Space_Object_Owner(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    if (Sys_Is_Planet_Effected_By_Happiness(planet_id)) then
      // Set Population To Riot
      call Sys_Set_Planet_Population_To_Riot(planet_id)

      // Log Message to owner
      set log_type := LOG_TYPE_PLANET_POP_RIOTING
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_14_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_14_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_14_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_14_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_PLANETNAME, planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_OWNER, planet_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return TRUE
end


//------------------------------------------------------------------------
function Execute_Event_Planet_Population_Rebel returns boolean
params
  planet_id:          long
vars
  sys_loc:            long
  sect_loc:           long
  planet_owner:       long
  planet_name:        string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_owner := Sys_Get_Space_Object_Owner(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    if (Sys_Is_Planet_Effected_By_Happiness(planet_id)) then
      call Sys_Space_Object_Set_To_New_Owner(planet_id, 0)

      // Log Message to owner
      set log_type := LOG_TYPE_PLANET_POP_REBEL
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_15_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_15_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_15_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_15_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_PLANETNAME, planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_OWNER, planet_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return TRUE
end


//------------------------------------------------------------------------
function Execute_Event_Planet_Cargo_Damage returns boolean
params
  planet_id:          long
vars
  sys_loc:            long
  sect_loc:           long
  planet_owner:       long
  planet_name:        string
  dmg_amount:         long
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_owner := Sys_Get_Space_Object_Owner(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    // Damage Amount
    set dmg_amount := Sys_Get_Random_Long(50, 1000)

    if (dmg_amount > 0) then
      call Sys_Space_Object_Take_Damage(planet_id, AI_MAIN_EVENT_NORMAL, dmg_amount)

      // Log Message to owner
      set log_type := LOG_TYPE_PLANET_CARGO_DAMAGE
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_16_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_16_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_16_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_16_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_PLANETNAME, planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_OWNER, planet_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return TRUE
end


//------------------------------------------------------------------------
function Execute_Event_Planet_Plague_Created returns boolean
params
  planet_id:          long
vars
  sys_loc:            long
  sect_loc:           long
  planet_owner:       long
  planet_name:        string
  plague_level:       long
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_owner := Sys_Get_Space_Object_Owner(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    // Plague
    set plague_level := Sys_Get_Random_Long(1, 3)

    if (plague_level > 0) then
      call Sys_Set_Planet_Plague_Level(planet_id, plague_level)

      // Log Message to owner
      set log_type := LOG_TYPE_PLANET_PLAGUED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_17_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_17_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_17_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_17_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_PLANETNAME, planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_OWNER, planet_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return TRUE
end

//------------------------------------------------------------------------
function Execute_Event_Planet_Plague_Cured returns boolean
params
  planet_id:          long
vars
  sys_loc:            long
  sect_loc:           long
  planet_owner:       long
  planet_name:        string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_owner := Sys_Get_Space_Object_Owner(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    call Sys_Set_Planet_Plague_Level(planet_id, 0)

    // Log Message to owner
    set log_type := LOG_TYPE_PLANET_PLAGUE_CURED
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_18_TITLE)
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_18_TEXT)
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_18_SMALL_PICTURE_FILENAME)
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_18_LARGE_PICTURE_FILENAME)

    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_PLANETNAME, planet_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

    call Give_Message_To_Players(MESSAGE_TO_OWNER, planet_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
  endif

  return TRUE
end

//------------------------------------------------------------------------
function Execute_Event_Planet_Created returns boolean
params
  sys_id:             long
vars
  retval:             boolean
  new_planet_id:      long
  sys_loc:            long
  sect_loc:           long
  planet_name:        string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  set retval := FALSE

  if (sys_id > 0) then
    set new_planet_id := Sys_Create_Planet(sys_id, 0)
    if (new_planet_id > 0) then
      set sys_loc := Sys_Get_Space_Object_System_Location(new_planet_id)
      set sect_loc := Sys_Get_Space_Object_Sector_Location(new_planet_id)
      set planet_name := Sys_Get_Space_Object_Name(new_planet_id)

      // Log Message to owner
      set log_type := LOG_TYPE_STELLAR_PLANET_CREATED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_19_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_19_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_19_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_19_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_PLANETNAME, planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
      set retval := TRUE
    endif
  endif

  return retval
end

//------------------------------------------------------------------------
function Execute_Event_Planet_Destroyed returns boolean
params
  planet_id:          long
vars
  retval:             boolean
  sys_loc:            long
  sect_loc:           long
  planet_name:        string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  set retval := FALSE

  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    set retval := Sys_Destroy_Planet(planet_id)

    if (retval) then
      // Log Message to owner
      set log_type := LOG_TYPE_STELLAR_PLANET_DESTROYED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_20_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_20_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_20_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_20_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_PLANETNAME, planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return retval
end

//------------------------------------------------------------------------
function Execute_Event_Star_Created returns boolean
params
  sys_id:        long
vars
  retval:             boolean
  new_star_id:        long
  sys_loc:            long
  sect_loc:           long
  star_name:          string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  set retval := FALSE

  if (sys_id > 0) then
    set new_star_id := Sys_Create_Star(sys_id, 0)

    if (new_star_id > 0) then
      set sys_loc := Sys_Get_Space_Object_System_Location(new_star_id)
      set sect_loc := Sys_Get_Space_Object_Sector_Location(new_star_id)
      set star_name := Sys_Get_Space_Object_Name(new_star_id)

      // Log Message to owner
      set log_type := LOG_TYPE_STELLAR_STAR_CREATED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_21_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_21_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_21_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_21_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_STARNAME, star_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
      set retval := TRUE
    endif
  endif

  return retval
end

//------------------------------------------------------------------------
function Execute_Event_Warp_Point_Closed returns boolean
params
  wp_id:              long
vars
  retval:             boolean
  sys_loc:            long
  sect_loc:           long
  wp_name:            string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  set retval := FALSE

  if (wp_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(wp_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(wp_id)
    set wp_name := Sys_Get_Space_Object_Name(wp_id)

    set retval := Sys_Close_Warp_Point(wp_id)

    if (retval) then
      // Log Message to owner
      set log_type := LOG_TYPE_STELLAR_WP_CLOSED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_23_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_23_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_23_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_23_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_WARPPOINTNAME, wp_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return retval
end


//------------------------------------------------------------------------
function Execute_Event_Warp_Point_Opened returns boolean
params
  sys_id:           long
vars
  retval:             boolean
  new_wp_id:          long
  sys_loc:            long
  sect_loc:           long
  wp_name:            string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  set retval := FALSE

  if (sys_id > 0) then
    set new_wp_id := Sys_Open_Warp_Point(sys_id, 0)

    if (new_wp_id > 0) then
      set sys_loc := Sys_Get_Space_Object_System_Location(new_wp_id)
      set sect_loc := Sys_Get_Space_Object_Sector_Location(new_wp_id)
      set wp_name := Sys_Get_Space_Object_Name(new_wp_id)

      // Log Message to owner
      set log_type := LOG_TYPE_STELLAR_WP_OPENED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_24_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_24_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_24_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_24_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_WARPPOINTNAME, wp_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
      set retval := TRUE
    endif
  endif

  return retval
end

//------------------------------------------------------------------------
function Execute_Event_Storm_Created returns boolean
params
  sys_id:           long
vars
  retval:             boolean
  new_storm_id:       long
  sys_loc:            long
  sect_loc:           long
  storm_name:         string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  set retval := FALSE

  if (sys_id > 0) then
    set new_storm_id := Sys_Create_Storm(sys_id, 0)

    if (new_storm_id > 0) then
      set sys_loc := Sys_Get_Space_Object_System_Location(new_storm_id)
      set sect_loc := Sys_Get_Space_Object_Sector_Location(new_storm_id)
      set storm_name := Sys_Get_Space_Object_Name(new_storm_id)

      // Log Message to owner
      set log_type := LOG_TYPE_STELLAR_STORM_CREATED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_25_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_25_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_25_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_25_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_STORMNAME, storm_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
      set retval := TRUE
    endif
  endif

  return retval
end

//------------------------------------------------------------------------
function Execute_Event_Storm_Destroyed returns boolean
params
  storm_id:           long
vars
  retval:             boolean
  sys_loc:            long
  sect_loc:           long
  storm_name:         string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  set retval := FALSE

  if (storm_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(storm_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(storm_id)
    set storm_name := Sys_Get_Space_Object_Name(storm_id)

    set retval := Sys_Destroy_Storm(storm_id)

    if (retval) then
      // Log Message to owner
      set log_type := LOG_TYPE_STELLAR_STORM_DESTROYED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_26_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_26_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_26_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_26_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_STORMNAME, storm_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return retval
end


//------------------------------------------------------------------------
function Execute_Event_Nebulae_Destroyed returns boolean
params
  sys_id:             long
vars
  retval:             boolean
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  set retval := FALSE

  if (sys_id > 0) then
    set retval := Sys_Destroy_Nebulae(sys_id)

    if (retval) then
      // Log Message to owner
      set log_type := LOG_TYPE_STELLAR_NEBULAE_DESTROYED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_28_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_28_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_28_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_28_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_id), TRUE, TRUE)
  
      call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_id, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return retval
end


//------------------------------------------------------------------------
function Execute_Event_Black_Hole_Destroyed returns boolean
params
  sys_id:           long
vars
  retval:             boolean
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  set retval := FALSE

  if (sys_id > 0) then
    set retval := Sys_Destroy_Black_Hole(sys_id)

    if (retval) then
      // Log Message to owner
      set log_type := LOG_TYPE_STELLAR_BLACK_HOLE_DESTROYED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_30_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_30_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_30_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_30_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_id), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_id, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif 
  endif

  return retval
end


//------------------------------------------------------------------------
function Execute_Event_Empire_Points_Change returns boolean
params
  plr_id:           long
vars
  min_amt:            long
  org_amt:            long
  rad_amt:            long
  max_min_amt:        long
  max_org_amt:        long
  max_rad_amt:        long
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin

  if (plr_id > 0) then
    set min_amt := Sys_Get_Random_Long(1000, 10000)
    set org_amt := Sys_Get_Random_Long(1000, 10000)
    set rad_amt := Sys_Get_Random_Long(1000, 10000)

    set max_min_amt := Sys_Get_Empire_Current_Points(plr_id, POINT_TYPE_MINERALS)
    set max_org_amt := Sys_Get_Empire_Current_Points(plr_id, POINT_TYPE_ORGANICS)
    set max_rad_amt := Sys_Get_Empire_Current_Points(plr_id, POINT_TYPE_RADIOACTIVES)
     
    if (min_amt > max_min_amt) then
      set min_amt := max_min_amt
    endif
    if (org_amt > max_org_amt) then
      set org_amt := max_org_amt
    endif
    if (rad_amt > max_rad_amt) then
      set rad_amt := max_rad_amt
    endif

    call Sys_Change_Empire_Points(plr_id, -min_amt, -org_amt, -rad_amt)

    // Log Message to owner
    set log_type := LOG_TYPE_POINTS_CHANGE
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_31_TITLE)
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_31_TEXT)
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_31_SMALL_PICTURE_FILENAME)
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_31_LARGE_PICTURE_FILENAME)

    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_MINERALSAMOUNT, Sys_Convert_Long_To_String(min_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_ORGANICSAMOUNT, Sys_Convert_Long_To_String(org_amt), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_RADIOACTIVESAMOUNT, Sys_Convert_Long_To_String(rad_amt), TRUE, TRUE)

    call Give_Message_To_Players(MESSAGE_TO_OWNER, plr_id, 0, 0, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
  endif

  return TRUE
end


//------------------------------------------------------------------------
function Timed_Events returns boolean
params
vars
  num_timed_events:   long
  index:              long
  sub_index:          long
  time_remaining:     long
  event_id:           long
  obj_id:             long
  sys_loc:            long
  sect_loc:           long
  storage_index:      long
  sub_storage_index1: long
  sub_storage_index2: long
begin

  // Execute events in progress
  set num_timed_events := Sys_Get_Event_Storage_Long(1)
  if (num_timed_events > 0) then
    for index := 1 to num_timed_events do
      set storage_index := BASE_EVENT_RECORD_LENGTH + (index * TIMED_EVENT_RECORD_LENGTH)

      set time_remaining := Sys_Get_Event_Storage_Long(storage_index + 0)
      set event_id := Sys_Get_Event_Storage_Long(storage_index + 1)
      set obj_id := Sys_Get_Event_Storage_Long(storage_index + 2)
      set sys_loc := Sys_Get_Event_Storage_Long(storage_index + 3)
      set sect_loc := Sys_Get_Event_Storage_Long(storage_index + 4)

      set time_remaining := time_remaining - 1
      call Sys_Set_Event_Storage_Long(storage_index + 0, time_remaining)

      case event_id
        EVENT_ID_STAR_DESTROYED:
          if (time_remaining = 0) then
            call Execute_Event_Star_Destroyed_End(obj_id)
          else
            call Execute_Event_Star_Destroyed_In_Progress(obj_id, time_remaining)
          endif
        EVENT_ID_NEBULAE_CREATED:
          if (time_remaining = 0) then
            call Execute_Event_Nebulae_Created_End(obj_id)
          else
            call Execute_Event_Nebulae_Created_In_Progress(obj_id, time_remaining)
          endif
        EVENT_ID_BLACK_HOLE_CREATED:
          if (time_remaining = 0) then
            call Execute_Event_Black_Hole_Created_End(obj_id)
          else
            call Execute_Event_Black_Hole_Created_In_Progress(obj_id, time_remaining)
          endif
      endcase

    endfor
  endif

  // Delete events that have finished. 
  if (num_timed_events > 0) then
    set index := 0
    loop
      set index := index + 1
      set storage_index := BASE_EVENT_RECORD_LENGTH + (index * TIMED_EVENT_RECORD_LENGTH)
      set time_remaining := Sys_Get_Event_Storage_Long(storage_index + 0)
      if (time_remaining = 0) then
        // Delete this entry
        if (index < num_timed_events) then
          for sub_index := index to num_timed_events - 1 do
            set sub_storage_index1 := BASE_EVENT_RECORD_LENGTH + (sub_index * TIMED_EVENT_RECORD_LENGTH)
            set sub_storage_index2 := BASE_EVENT_RECORD_LENGTH + ((sub_index + 1) * TIMED_EVENT_RECORD_LENGTH)
            call Sys_Set_Event_Storage_Long(sub_storage_index1 + 0, Sys_Get_Event_Storage_Long(sub_storage_index2 + 0))
            call Sys_Set_Event_Storage_Long(sub_storage_index1 + 1, Sys_Get_Event_Storage_Long(sub_storage_index2 + 1))
            call Sys_Set_Event_Storage_Long(sub_storage_index1 + 2, Sys_Get_Event_Storage_Long(sub_storage_index2 + 2))
            call Sys_Set_Event_Storage_Long(sub_storage_index1 + 3, Sys_Get_Event_Storage_Long(sub_storage_index2 + 3))
            call Sys_Set_Event_Storage_Long(sub_storage_index1 + 4, Sys_Get_Event_Storage_Long(sub_storage_index2 + 4))
          endfor
        endif
        set num_timed_events := num_timed_events - 1
      endif

      exitwhen (index >= num_timed_events) or (num_timed_events = 0)
    endloop
  endif
  call Sys_Set_Event_Storage_Long(1, num_timed_events)

  return TRUE
end


//------------------------------------------------------------------------
function Execute_Event_Star_Destroyed_Begin returns boolean
params
  star_id:            long
vars
  sys_loc:            long
  sect_loc:           long
  star_name:          string
  time_remaining:     long
  log_type:           long
  num_timed_events:   long
  storage_index:      long
begin

  if (star_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(star_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(star_id)
    set star_name := Sys_Get_Space_Object_Name(star_id)

    set time_remaining := Sys_Get_Random_Long(7, 20)
 
    set num_timed_events := Sys_Get_Event_Storage_Long(1)
    set num_timed_events := num_timed_events + 1
    set storage_index := BASE_EVENT_RECORD_LENGTH + (num_timed_events * TIMED_EVENT_RECORD_LENGTH)
    call Sys_Set_Event_Storage_Long(1, num_timed_events)
    call Sys_Set_Event_Storage_Long(storage_index + 0, time_remaining)
    call Sys_Set_Event_Storage_Long(storage_index + 1, EVENT_ID_STAR_DESTROYED)
    call Sys_Set_Event_Storage_Long(storage_index + 2, star_id)
    call Sys_Set_Event_Storage_Long(storage_index + 3, sys_loc)
    call Sys_Set_Event_Storage_Long(storage_index + 4, sect_loc)

    call Execute_Event_Star_Destroyed_In_Progress(star_id, time_remaining)

  endif

  return TRUE
end

//------------------------------------------------------------------------
function Execute_Event_Star_Destroyed_In_Progress returns boolean
params
  star_id:            long
  time_remaining:     long
vars
  sys_loc:            long
  sect_loc:           long
  star_name:          string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin

  if (star_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(star_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(star_id)
    set star_name := Sys_Get_Space_Object_Name(star_id)

    // Log Message to owner
    set log_type := LOG_TYPE_EVENT
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_22_TITLE)
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_22_TEXT)
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_22_SMALL_PICTURE_FILENAME)
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_22_LARGE_PICTURE_FILENAME)

    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_STARNAME, star_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_TIMEREMAINING, Sys_Convert_Long_To_Date_String(time_remaining), TRUE, TRUE)

    call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
  endif

  return TRUE
end

//------------------------------------------------------------------------
function Execute_Event_Star_Destroyed_End returns boolean
params
  star_id:            long
vars
  retval:             boolean
  sys_loc:            long
  sect_loc:           long
  star_name:          string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  set retval := FALSE
  if (star_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(star_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(star_id)
    set star_name := Sys_Get_Space_Object_Name(star_id)

    set retval := Sys_Destroy_Star(star_id)

    if (retval) then
      // Log Message to owner
      set log_type := LOG_TYPE_STELLAR_STAR_DESTROYED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_32_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_32_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_32_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_32_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_STARNAME, star_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return retval
end

//------------------------------------------------------------------------
function Execute_Event_Nebulae_Created_Begin returns boolean
params
  star_id:            long
vars
  sys_loc:            long
  sect_loc:           long
  star_name:          string
  time_remaining:     long
  log_type:           long
  num_timed_events:   long
  storage_index:      long
begin

  if (star_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(star_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(star_id)
    set star_name := Sys_Get_Space_Object_Name(star_id)

    set time_remaining := Sys_Get_Random_Long(7, 20)
 
    set num_timed_events := Sys_Get_Event_Storage_Long(1)
    set num_timed_events := num_timed_events + 1
    set storage_index := BASE_EVENT_RECORD_LENGTH + (num_timed_events * TIMED_EVENT_RECORD_LENGTH)
    call Sys_Set_Event_Storage_Long(1, num_timed_events)
    call Sys_Set_Event_Storage_Long(storage_index + 0, time_remaining)
    call Sys_Set_Event_Storage_Long(storage_index + 1, EVENT_ID_NEBULAE_CREATED)
    call Sys_Set_Event_Storage_Long(storage_index + 2, star_id)
    call Sys_Set_Event_Storage_Long(storage_index + 3, sys_loc)
    call Sys_Set_Event_Storage_Long(storage_index + 4, sect_loc)

    call Execute_Event_Nebulae_Created_In_Progress(star_id, time_remaining)

  endif

  return TRUE
end

//------------------------------------------------------------------------
function Execute_Event_Nebulae_Created_In_Progress returns boolean
params
  star_id:            long
  time_remaining:     long
vars
  sys_loc:            long
  sect_loc:           long
  star_name:          string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin

  if (star_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(star_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(star_id)
    set star_name := Sys_Get_Space_Object_Name(star_id)

    // Log Message to owner
    set log_type := LOG_TYPE_EVENT
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_27_TITLE)
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_27_TEXT)
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_27_SMALL_PICTURE_FILENAME)
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_27_LARGE_PICTURE_FILENAME)

    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_STARNAME, star_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_TIMEREMAINING, Sys_Convert_Long_To_Date_String(time_remaining), TRUE, TRUE)

    call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
  endif

  return TRUE
end

//------------------------------------------------------------------------
function Execute_Event_Nebulae_Created_End returns boolean
params
  star_id:            long
vars
  retval:             boolean
  sys_loc:            long
  sect_loc:           long
  star_name:          string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  set retval := FALSE

  if (star_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(star_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(star_id)
    set star_name := Sys_Get_Space_Object_Name(star_id)

    set retval := Sys_Create_Nebulae(sys_loc)

    if (retval) then
      // Log Message to owner
      set log_type := LOG_TYPE_STELLAR_NEBULAE_CREATED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_33_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_33_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_33_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_33_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_STARNAME, star_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return retval
end

//------------------------------------------------------------------------
function Execute_Event_Black_Hole_Created_Begin returns boolean
params
  star_id:            long
vars
  sys_loc:            long
  sect_loc:           long
  star_name:          string
  time_remaining:     long
  log_type:           long
  num_timed_events:   long
  storage_index:      long
begin

  if (star_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(star_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(star_id)
    set star_name := Sys_Get_Space_Object_Name(star_id)

    set time_remaining := Sys_Get_Random_Long(7, 20)
 
    set num_timed_events := Sys_Get_Event_Storage_Long(1)
    set num_timed_events := num_timed_events + 1
    set storage_index := BASE_EVENT_RECORD_LENGTH + (num_timed_events * TIMED_EVENT_RECORD_LENGTH)
    call Sys_Set_Event_Storage_Long(1, num_timed_events)
    call Sys_Set_Event_Storage_Long(storage_index + 0, time_remaining)
    call Sys_Set_Event_Storage_Long(storage_index + 1, EVENT_ID_STAR_DESTROYED)
    call Sys_Set_Event_Storage_Long(storage_index + 2, star_id)
    call Sys_Set_Event_Storage_Long(storage_index + 3, sys_loc)
    call Sys_Set_Event_Storage_Long(storage_index + 4, sect_loc)

    call Execute_Event_Star_Destroyed_In_Progress(star_id, time_remaining)

  endif

  return TRUE
end

//------------------------------------------------------------------------
function Execute_Event_Black_Hole_Created_In_Progress returns boolean
params
  star_id:            long
  time_remaining:     long
vars
  sys_loc:            long
  sect_loc:           long
  star_name:          string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin

  if (star_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(star_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(star_id)
    set star_name := Sys_Get_Space_Object_Name(star_id)

    // Log Message to owner
    set log_type := LOG_TYPE_EVENT
    set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_29_TITLE)
    set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_29_TEXT)
    set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_29_SMALL_PICTURE_FILENAME)
    set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_29_LARGE_PICTURE_FILENAME)

    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_STARNAME, star_name, TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)
    set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_TIMEREMAINING, Sys_Convert_Long_To_Date_String(time_remaining), TRUE, TRUE)

    call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
  endif

  return TRUE
end

//------------------------------------------------------------------------
function Execute_Event_Black_Hole_Created_End returns boolean
params
  star_id:            long
vars
  retval:             boolean
  sys_loc:            long
  sect_loc:           long
  star_name:          string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  set retval := FALSE

  if (star_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(star_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(star_id)
    set star_name := Sys_Get_Space_Object_Name(star_id)

    set retval := Sys_Create_Black_Hole(star_id)

    if (retval) then
      // Log Message to owner
      set log_type := LOG_TYPE_STELLAR_BLACK_HOLE_CREATED
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_34_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_34_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_34_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_34_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_STARNAME, star_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SECTORLOC, Sys_Get_Sector_Coordinates(sect_loc), TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_SYSTEM, 0, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
    endif
  endif

  return retval
end

// -------------------------------------------------------------------------------------
function Anger_Events returns boolean

vars
   retval2:      long
   colony_list:  longlist
   colony_total: long
   colony_id:    long
   yesorno:      boolean
   chance:       long

begin
   
set chance := 0
set colony_id := 0

call Sys_Get_List_Of_Space_Objects_Of_Type(SPACE_OBJECT_TYPE_PLANET, colony_list, TRUE, TRUE, 0)
set colony_total := colony_list.count()

for colony_id := 1 to colony_total do
   set yesorno := Sys_Is_Planet_Effected_By_Happiness(colony_id)
   set chance := Sys_Get_Random_Long(1, 100)
      If ((yesorno = TRUE) AND (Sys_Get_Planet_Happiness(colony_id) >= PLANET_RIOTING) AND (chance <= 20)) then
         set chance := Sys_Get_Random_Long(1, 4)
         case chance
           ONE:
           call Execute_Event(EVENT_ID_PLANET_POPULATION_CHANGE)
           TWO:
           call Execute_Event(EVENT_ID_PLANET_POPULATION_REBEL)
           THREE:
           call Execute_Event(EVENT_ID_PLANET_CARGO_DAMAGE)
           FOUR:
           call Execute_Event(EVENT_ID_PLANET_FAILED_COUP)
         endcase
       else
       If ((yesorno = TRUE) AND (Sys_Get_Planet_Happiness(colony_id) >= PLANET_ANGRY) AND (chance <= 10)) then
          set chance := Sys_Get_Random_Long(1, 4)
          case chance
           ONE:
           call Execute_Event(EVENT_ID_PLANET_POPULATION_CHANGE)
           TWO:
           call Execute_Event(EVENT_ID_PLANET_POPULATION_REBEL)
           THREE:
           call Execute_Event(EVENT_ID_PLANET_CARGO_DAMAGE)
           FOUR:
           call Execute_Event(EVENT_ID_PLANET_FAILED_COUP)
          endcase
        else
        If ((yesorno = TRUE) AND (Sys_Get_Planet_Happiness(colony_id) >= PLANET_UNHAPPY) AND (chance <= 5)) then 
          set chance := Sys_Get_Random_Long(1, 4)
          case chance
           ONE:
           call Execute_Event(EVENT_ID_PLANET_POPULATION_CHANGE)
           TWO:
           call Execute_Event(EVENT_ID_PLANET_POPULATION_REBEL)
           THREE:
           call Execute_Event(EVENT_ID_PLANET_CARGO_DAMAGE)
           FOUR:
           call Execute_Event(EVENT_ID_PLANET_FAILED_COUP)
          endcase
         endif  
         endif
         endif     
endfor

return TRUE
end

// --------------------------------------------------------------------------------------------
function Execute_Event_Failed_Coup returns boolean
params
  planet_id:  long
vars
  happiness_change:   long
  dmg_amount:         long
  pop_change:         long
  pop_change_string:  string
  max_pop:            long
  sys_loc:            long
  sect_loc:           long
  planet_owner:       long
  planet_name:        string
  message_title:      string
  message_text:       string
  msg_small_pic:      string
  msg_large_pic:      string
  log_type:           long
begin
  
  if (planet_id > 0) then
    set sys_loc := Sys_Get_Space_Object_System_Location(planet_id)
    set sect_loc := Sys_Get_Space_Object_Sector_Location(planet_id)
    set planet_owner := Sys_Get_Space_Object_Owner(planet_id)
    set planet_name := Sys_Get_Space_Object_Name(planet_id)

    // Angers Population
    if (Sys_Is_Planet_Effected_By_Happiness(planet_id)) then
      set happiness_change := Sys_Get_Random_Long(10, 40)
      call Sys_Change_Planet_Population_Happiness(planet_id, -happiness_change)
    endif

    // Cargo Damage Amount
    set dmg_amount := Sys_Get_Random_Long(50, 1000)
    if (dmg_amount > 0) then
      call Sys_Space_Object_Take_Damage(planet_id, AI_MAIN_EVENT_NORMAL, dmg_amount)   
    endif

    // Set Population Change
    set pop_change := Sys_Get_Random_Long(1, 50)
    set max_pop := Sys_Get_Planet_Population(planet_id)
    if (pop_change > max_pop) then
      set pop_change := max_pop - 1
    endif

    call Sys_Change_Planet_Population(planet_id, -pop_change)
 
      // Log Message to owner
      set log_type := LOG_TYPE_PLANET_POP_REBEL
      set message_title := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_35_TITLE)
      set message_text  := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_35_TEXT)
      set msg_small_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_35_SMALL_PICTURE_FILENAME)
      set msg_large_pic := Sys_Get_Datafile_Field_Value_As_String(lng_Datafile_Event_Text_ID, AI_MAIN_EVENT_EVENT_MESSAGE_35_LARGE_PICTURE_FILENAME)

      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_PLANETNAME, planet_name, TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_SYSTEMNAME, Sys_Get_Solar_System_Name(sys_loc), TRUE, TRUE)
      set message_text := Sys_Replace_String(message_text, AI_MAIN_EVENT_FLAG_AMOUNT, pop_change_string, TRUE, TRUE)

      call Give_Message_To_Players(MESSAGE_TO_OWNER, planet_owner, sys_loc, sect_loc, message_title, message_text, msg_small_pic, msg_large_pic, log_type)
  endif

  return TRUE
end

